
/*-----------------------------------------------------------------------------
 * HEADER FILES
 *---------------------------------------------------------------------------*/
#include "gmi_gpio.h"

#include "gmi_status.h"

#ifdef __GMI_STM32__
#include "main.h"
#endif

/*-----------------------------------------------------------------------------
 * FUNCTIONS DEFINITION
 *---------------------------------------------------------------------------*/
GMI_STATUS gmi_pin_init(gmi_gpio_t* pin)
{
    GMI_STATUS status = GMI_STATUS_OK;
    CHECK_NULL(pin);

    return status;
}

GMI_STATUS gmi_pin_deinit(gmi_gpio_t* pin)
{
    GMI_STATUS status = GMI_STATUS_OK;
    CHECK_NULL(pin);

    return status;
}

gmi_pin_level_t gmi_pin_get_level(gmi_gpio_t* pin)
{
    if (pin == NULL)
    {
        return HIGH_Z;
    }

#ifdef __GMI_STM32__
    return (gmi_pin_level_t)HAL_GPIO_ReadPin((GPIO_TypeDef*)(pin->port), pin->pin);
#else
    return LOW_LEVEL;  // !!! pseudo code
#endif
}

GMI_STATUS gmi_pin_set_level(gmi_gpio_t* pin, gmi_pin_level_t level)
{
    GMI_STATUS status = GMI_STATUS_OK;
    CHECK_NULL(pin);

#ifdef __GMI_STM32__
    HAL_GPIO_WritePin((GPIO_TypeDef*)(pin->port), pin->pin, (GPIO_PinState)level);
#endif

    return status;
}

GMI_STATUS gmi_pin_set_dir(gmi_gpio_t* pin, gmi_pin_dir_t dir)
{
    GMI_STATUS status = GMI_STATUS_OK;
    CHECK_NULL(pin);

#ifdef __GMI_STM32__
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin              = pin->pin;

    if (dir == GMI_GPIO_INPUT)
    {
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
    }
    else
    {
        GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull  = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    }
    HAL_GPIO_Init((GPIO_TypeDef*)(pin->port), &GPIO_InitStruct);
#endif

    return status;
}